//package com.net.io.nio.three.component.buffer;
//
//import java.io.IOException;
//import java.nio.ByteBuffer;
//import java.nio.channels.SocketChannel;
//
///**
// * @author zhangtengfei
// * @date 2022/1/27 17:26
// */
//public class ReadWriteBuffer {
//
//    /**
//     * 向 Buffer 中写数据
//     */
//    public static void writeBuffer() {
//        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
//​
//        // 1. byte 范围是多少？ byte 由8bit表示，2^8=256，范围[-128~127]
//        byte b = 127;
//        // 填充一个 byte 值
//        byteBuffer.put(b);
//​
//        // 2. 在指定位置填充一个 byte 值
//        byteBuffer.put(20, b);
//​
//        // 3. 将一个数组中的值填充进去
//        byte[] byteArray = "something".getBytes();
//        byteBuffer.put(byteArray);
//​
//        // 4. 在指定位置填充一个 byte 数组
//        //参数一：byte数组  参数二：src开始位置   参数三：有效数据长度
//        byteBuffer.put(byteArray, 0, byteArray.length);
//        //上述这些方法需要自己控制 Buffer 大小，不能超过 capacity，超过会抛 java.nio.BufferOverflowException 异常。
// 
//        // 5. （常用）将来自 Channel 的数据填充到 Buffer 中， 在系统层面上，这个操作我们称为读操作，因为数据是从外部（文件或网络等）读到内存中。
//        try {
//            // ps：伪代码，这段代码无法正常运行..
//            SocketChannel socketChannel = socketChannel();
//            //read方法会返回读取的数据量num，相对于buffer来说，channel读取 对应 buffer 写操作。
//            int num = socketChannel.read(byteBuffer);
//        } catch (IOException e) {
//        }
//    }
//
//    /**
//     * 从buffer中读数据
//     */
//    public static void readBuffer(ByteBuffer byteBuffer) {
//        // 1. 按照position顺序读取，每get一次，position + 1
//        byte val1 = byteBuffer.get();
//
//        // 2. 获取指定位置的数据
//        byte val2 = byteBuffer.get(10);
//
//        // 3. 将buffer中的数据，拷贝到一个指定的数组中
//        byte[] bytes = new byte[1024];
//        byteBuffer.get(bytes);
//
//        // 4. 另一个经常使用的方法，直接返回Buffer内部的byte[]数组
//        String str = new String(byteBuffer.array());
//         
//        // 5. 网络编程中，我们将数据发送至对端 或者 使用FileChannel将内存中的数据写入到硬盘
//        // 这种操作，我们通常称之为 Channel 的写操作，与之对应的 Buffer 就是 读操作。
//        try {
//            // ps：伪代码，这段代码无法正常运行..
//            SocketChannel socketChannel = socketChannel();
//            // flip方法将 Buffer 从写模式切换到读模式。
//            // 调用flip()方法会将 position 设回0，并将 limit 设置成之前 position 的值。
//            byteBuffer.flip();
//            socketChannel.write(byteBuffer);
//        } catch (IOException e) {
//        }
//    }
//}
